# -*- coding: utf-8 -*-
__author__ = 'lztkdr'
__date__ = '2020/11/23 15:47'

"""
    单继承,class B(A) 括号里面的是相对B来说的B的父类，集成了A的属性和方法
    1- python中类的属性是直接写在init方法中的
"""


class A(object):

	def __init__(self):
		self.num = 10

	def print_num(self):
		print(self.num + 10)


class B(A):

	def my_func(self):
		print("我自己B类的自定义方法")


b = B()
# 调用父类 属性/方法
print(b.num)
b.print_num()
# 调用自身方法
b.my_func()

print('------------------------------------')

"""
    多继承class D(C, A),如果多个父类C,A中都含有相同的方法和属性print_num那么子类D继承的是就是C的，注意继承的先后顺序
    1- 父类中的属性和方法如果相同的话，会继承第一个父类的属性和方法，按照集成的顺序走init构造方法
    2- D类中重写父类的方法,如果自己d类中重写了init方法，那么就不会继承任何的父类属性从init方法中（*****）
    3- 换句话，子类重写了父类的方法，那么不在使用父类同名的方法，包括init构造方法
    4- 子类中重写了父类的方法但是还是想调用父类的方法，
"""


class C(object):

	def __init__(self):
		self.num = 28

	def print_num(self):
		print(self.num + 10)


class D(C, A):

	def __init__(self):
		self.age = "这是D类自己的属性age"
		self.num = "这是D类重写父类的属性num"

	def print_num(self):
		self.__init__()  # 再将self.num更改回来
		print("这是D自己重写父类的方法")

	# 但是子类还是想使用**父类的属性**调用父类重名的print_num方法
	# 使用A.__init__(self)方法来更改self.num的值
	def print_a_num(self):
		print(d.num)  # 本来D对象中self.num = "这是D类重写父类的属性num"
		A.__init__(self)  # 把self传进去，当前的self.num = 10
		A.print_num(self)

	# 或者使用super在子类方法中调用父类的方法
	def print_c_num(self):
		# super(D, self).print_num()    或者下面的简写形式
		super().print_num()

	def my_func(self):
		print("我自己D类的自定义方法")


d = D()
d.print_a_num()
print(d.num)
d.print_num()
